//Shirasu Azusa 2024.02.18
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb emplace_back
#define mp make_pair
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
template<typename T,typename U>
T ceil(T x, U y) {return (x>0?(x+y-1)/y:x/y);}
template<typename T,typename U>
T floor(T x, U y) {return (x>0?x/y:(x-y+1)/y);}
template<class T,class S>
bool chmax(T &a,const S b) {return (a<b?a=b,1:0);}
template<class T,class S>
bool chmin(T &a,const S b) {return (a>b?a=b,1:0);}
int popcnt(int x) {return __builtin_popcount(x);}
int popcnt(ll x)  {return __builtin_popcountll(x);}
int topbit(int x) {return (x==0?-1:31-__builtin_clz(x));}
int topbit(ll x)  {return (x==0?-1:63-__builtin_clzll(x));}
int lowbit(int x) {return (x==0?-1:__builtin_ctz(x));}
int lowbit(ll x)  {return (x==0?-1:__builtin_ctzll(x));}

#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
typedef tuple<int,int,int> tiii;
int read() {
  int x=0,w=1; char c=getchar(); 
  while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
  while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();} 
  return x*w;
}

const int N=2e6+5,mod=998244353;
int n,m,k,p,f[N],g[N];
int fac[N],inv[N],ifac[N];
int ksm(int x,int y,int res=1) {
  for(;y;y>>=1,x=x*x%mod) if(y%2==1) res=res*x%mod;
  return res;
}
void pre(int n) {
  inv[0]=inv[1]=fac[0]=ifac[0]=1;
  rep(i,1,n) fac[i]=fac[i-1]*i%mod;
  ifac[n]=ksm(fac[n],mod-2);
  per(i,n-1,1) ifac[i]=ifac[i+1]*(i+1)%mod;
  rep(i,2,n) inv[i]=ifac[i]*fac[i-1]%mod;
}

namespace Poly {
  const int N=19;
  const int T=128000;
  int n,tn,in,inv[1<<N],w[N][1<<N],iw[N][1<<N];
  int A[T];vi g[T<<2],f[T<<2];
  int add(int x,int y) {x+=y;return (x<mod ? x : x-mod);}
  int dec(int x,int y) {x-=y;return (x>=0 ? x : x+mod);}
  void init(int g){
    inv[0]=inv[1]=1;
    for(int i=2;i<(1<<N);i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
    for(int i=0;i<N;i++){
      w[i][0]=iw[i][0]=1;
      w[i][1]=ksm(g,(mod-1>>i+1));
      iw[i][1]=ksm(w[i][1],mod-2);
      for(int j=2;j<(1<<i);j++){
        w[i][j]=(ll)w[i][1]*w[i][j-1]%mod;
        iw[i][j]=(ll)iw[i][1]*iw[i][j-1]%mod;
      }
    }
  }
  void get_n(int m){
    n=1,tn=0;
    while (n<m)n<<=1,tn++;
    in=ksm(n,mod-2);
  }
  void dft(int *a){
    for(int i=n,t=0;i>1;i>>=1,t++){
      int *W=w[tn-t-1];
      for(int j=0;j<n;j+=i)
        for(int k=0;k<(i>>1);k++){
          int x=a[j+k],y=a[j+k+(i>>1)];
          a[j+k]=add(x,y);
          a[j+k+(i>>1)]=(ll)(x-y+mod)*W[k]%mod;
        }
    }
  }
  void idft(int *a){
    for(int i=2,t=0;i<=n;i<<=1,t++){
      int *W=iw[t];
      for(int j=0;j<n;j+=i)
        for(int k=0;k<(i>>1);k++){
          int x=a[j+k],y=(ll)W[k]*a[j+k+(i>>1)]%mod;
          a[j+k]=add(x,y),a[j+k+(i>>1)]=dec(x,y); 
        }
    }
    for(int i=0;i<n;i++)a[i]=(ll)in*a[i]%mod;
  }
  vi mul(vi a,vi b,int ma,int mb,int m){
    ma=min(ma,m),mb=min(mb,m);
    get_n(ma+mb-1);
    a.resize(n),b.resize(n);
    for(int i=ma;i<n;i++)a[i]=0;
    for(int i=mb;i<n;i++)b[i]=0;
    dft(a.data()),dft(b.data());
    for(int i=0;i<n;i++)a[i]=(ll)a[i]*b[i]%mod;
    idft(a.data()),a.resize(m);
    return a;
  }
  vi get_inv(vi a,int m){
    if (m==1)return vi{ksm(a[0],mod-2)};
    vi s=get_inv(a,(m+1>>1)),ans;
    get_n(m<<1);
    a.resize(n),s.resize(n),ans.resize(n);
    for(int i=m;i<n;i++)a[i]=0;
    dft(a.data()),dft(s.data());
    for(int i=0;i<n;i++)ans[i]=(ll)s[i]*(mod+2-(ll)a[i]*s[i]%mod)%mod;
    idft(ans.data()),ans.resize(m);
    return ans;
  }
  vi get_ln(vi a,int m){
    if (m==1)return vi{0};
    vi ans(m-1);
    for(int i=1;i<m;i++)ans[i-1]=(ll)i*a[i]%mod;
    ans=mul(ans,get_inv(a,m),m-1,m,m);
    for(int i=m-1;i;i--)ans[i]=(ll)inv[i]*ans[i-1]%mod;
    ans[0]=0;
    return ans;
  }
  vi get_exp(vi a,int m){
    if (m==1)return vi{1};
    vi s=get_exp(a,(m+1>>1)),ans;
    s.resize(m),ans=get_ln(s,m);
    ans[0]=dec(1,ans[0]);
    for(int i=1;i<m;i++)ans[i]=dec(a[i],ans[i]);
    return mul(s,ans,(m+1>>1),m,m);
  }
  vi get_div(vi a,vi b,int ma,int mb){
    reverse(a.begin(),a.begin()+ma);
    reverse(b.begin(),b.begin()+mb);
    b.resize(ma-mb+1);
    vi ans=get_inv(b,ma-mb+1);
    ans=mul(a,ans,ma,ma-mb+1,ma-mb+1);
    reverse(ans.begin(),ans.end());
    return ans;
  }
  vi get_mod(vi a,vi b,int ma,int mb){
    vi ans=get_div(a,b,ma,mb);
    ans=mul(b,ans,mb,ma-mb+1,mb-1);
    for(int i=0;i<mb-1;i++)ans[i]=dec(a[i],ans[i]);
    return ans;
  }
  vi get_pow(vi a,int m,int k){
    if (!k){
      for(int i=0;i<m;i++)a[i]=(!i);
      return a;
    }
    int t=0;
    while ((t<m)&&(!a[t]))t++;
    if ((ll)t*k>=m)return vi(m,0);
    int s1=ksm(a[t],mod-2),s2=ksm(a[t],k);
    for(int i=t;i<m;i++)a[i-t]=(ll)s1*a[i]%mod;
    a=get_ln(a,m-t);
    for(int i=0;i<m-t;i++)a[i]=(ll)k*a[i]%mod;
    a=get_exp(a,m-t);
    t*=k;
    for(int i=m-1;i>=t;i--)a[i]=(ll)s2*a[i-t]%mod;
    for(int i=0;i<t;i++)a[i]=0;
    return a;
  }
};

signed main() {
  freopen("sequence.in","r",stdin);
  freopen("sequence.out","w",stdout);
  n=read(), m=read(), k=read(), p=read();
  pre(n); vi f(n+1);
  Poly::init(3);
  rep(i,0,n) {
    if(i==0) f[i]=(k==0?1:0);
    else f[i]=ksm(i,i+k)*ifac[i]%mod;
  }
  vi g=Poly::get_pow(f,n+1,m);
  printf("%lld\n",g[n]*fac[n]%mod);
  return 0;
}